package nc.pub.hrpbm.util;

import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.ufida.report.anareport.base.BaseSearchTemplateCondition;
import nc.pub.smart.context.SmartContext;
import nc.pub.smart.data.DataSet;
import nc.pub.smart.metadata.Field;
import nc.pub.smart.metadata.MetaData;
import nc.vo.pub.JavaType;
import nc.vo.pub.SuperVO;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nccloud.commons.lang.ArrayUtils;
import nccloud.dto.baseapp.querytree.dataformat.Condition;
import nccloud.dto.baseapp.querytree.dataformat.QueryTreeFormatVO;

/**
 * 报表工具类
 * @author yx
 * @date 2024/7/10
 */
public class HrpbmReportUtils {

	/**
	 * 处理上下文
	 * @param context
	 */
	public static void handelContext(SmartContext context) {
        BaseSearchTemplateCondition templateCondition = (BaseSearchTemplateCondition)context.getAttribute("FreeReport_All_Condition");
        if(null != templateCondition) {
            QueryTreeFormatVO conditionTree = templateCondition.getConditionTree();
            List<Condition> list = conditionTree.getQuerycondition().getConditions();
            for(Condition cond : list) {
                String file = cond.getField();
                String val = cond.getValue().getFirstvalue();
                if("between".equals(cond.getOprtype())) {
                	val = cond.getValue().getFirstvalue()+","+cond.getValue().getSecondvalue();
                }
                context.setAttribute(file, val);
            }
        }
    }
	
	/**
	 * 设置字段类型及精度
	 * @param fieldTypes 字段类型
	 * @param fields     字段列
	 * @return 返回元数据的模型
	 * @date 2023-01-04
	 */
	public static MetaData getMetaDatab(String[] fieldTypes, String[] fields) {
		if (ArrayUtils.isEmpty(fieldTypes) || ArrayUtils.isEmpty(fields)) {
			ExceptionUtils.wrappBusinessException("报表字段列或字段类型不能为空，请检查！！！");
		}
		// 设置元数据字段的类型和精度
		List<Field> fieldList = new ArrayList<Field>();
		for (int i = 0; i < fieldTypes.length; i++) {
			String javatype = fieldTypes[i];
			Field field = new Field();
			// 用于给报表元数据设置字段名称
			field.setFldname(fields[i]);
			if ("String".equals(javatype)) {
				field.setDbColumnType(Types.VARCHAR);
				// 设置字符串的长度
				field.setPrecision(200);
			} else if ("Double".equals(javatype)) {
				
				field.setDbColumnType(Types.VARCHAR);
				// 设置字符串的长度
				field.setPrecision(200);
//				field.setDbColumnType(Types.DECIMAL);
//				field.setPrecision(28);
//				field.setScale(2);
			} else if ("Integer".equals(javatype)) {
				field.setDbColumnType(Types.INTEGER);
			} else if ("UFDate".equals(javatype)) {
				field.setDbColumnType(Types.CHAR);
				field.setPrecision(19);
			} else if ("UFBoolean".equals(javatype)) {
				field.setDbColumnType(Types.BOOLEAN);
			}
			fieldList.add(field);
		}
		return new MetaData(fieldList.toArray(new Field[fieldList.size()]));
	}
	
	/**
	 * 构造数据集
	 * @param meta    元数据
	 * @param vos     结果集
	 * @param fields  字段列
	 * @return
	 */
	public static DataSet buildDataSet(MetaData meta, SuperVO[] vos, String[] fields) {
		if (ArrayUtils.isEmpty(fields)) {
			ExceptionUtils.wrappBusinessException("报表字段列不能为空，请检查！！！");
		}
		DataSet ds = null;
		if (null == vos || vos.length == 0) {
			// 返回空数据集, 用于给语义模型加载空数据用
			Object[][] datas = new Object[1][fields.length];
			ds = new DataSet(meta, datas);
		} else {
			Object[][] datas = new Object[vos.length][fields.length];
			for(int i = 0;i < vos.length;i++){
				for(int j = 0; j < fields.length; j++ ) {
					datas[i][j] = vos[i].getAttributeValue(fields[j]);
				}
			}
			ds = new DataSet(meta, datas);
		}
		return ds;
	}
	
	public static DataSet buildDataSetobj(MetaData meta, List<Map> list, String[] fields) {
		if (ArrayUtils.isEmpty(fields)) {
			ExceptionUtils.wrappBusinessException("报表字段列不能为空，请检查！！！");
		}
		DataSet ds = null;
		if (null == list || list.size() == 0) {
			// 返回空数据集, 用于给语义模型加载空数据用
			Object[][] datas = new Object[1][fields.length];
			ds = new DataSet(meta, datas);
		} else {
			Object[][] datas = new Object[list.size()][fields.length];
			for(int i = 0;i < list.size();i++){
				for(int j = 0; j < fields.length; j++ ) {
					datas[i][j] = list.get(i).get(fields[j]);
							//vos[i].getAttributeValue(fields[j]);
				}
			}
			ds = new DataSet(meta, datas);
		}
		return ds;
	}
	
	/**
	 * 设置字段类型及精度
	 * @param fieldTypes 字段类型
	 * @param fields     字段列
	 * @return 返回元数据的模型
	 * @date 2023-01-04
	 */
	public static MetaData getMetaData(String[] fieldTypes, String[] fields) {
		if (ArrayUtils.isEmpty(fieldTypes) || ArrayUtils.isEmpty(fields)) {
			ExceptionUtils.wrappBusinessException("报表字段列或字段类型不能为空，请检查！！！");
		}
		// 设置元数据字段的类型和精度
		List<Field> fieldList = new ArrayList<Field>();
		for (int i = 0; i < fieldTypes.length; i++) {
			String javatype = fieldTypes[i];
			Field field = new Field();
			// 用于给报表元数据设置字段名称
			field.setFldname(fields[i]);
			if (JavaType.String.equals(javatype)) {
				field.setDbColumnType(Types.VARCHAR);
				// 设置字符串的长度
				field.setPrecision(200);
			} else if (JavaType.UFDouble.equals(javatype)) {
				field.setDbColumnType(Types.DECIMAL);
				field.setPrecision(20);
				field.setScale(8);
			} else if (JavaType.Integer.equals(javatype)) {
				field.setDbColumnType(Types.INTEGER);
			} else if (JavaType.UFDate.equals(javatype)) {
				field.setDbColumnType(Types.CHAR);
				field.setPrecision(19);
			} else if (JavaType.UFBoolean.equals(javatype)) {
				field.setDbColumnType(Types.BOOLEAN);
			}
			fieldList.add(field);
		}
		return new MetaData(fieldList.toArray(new Field[fieldList.size()]));
	}
}
